/******************* Contiene las variables y funciones globales ****************/

#ifndef GLOBAL_CPP
#define GLOBAL_CPP

#include "global.h"

/* Obtengo los parametros de la clase parser.cpp y los asigno a las variables globales
 *
 * [0] = representacion
 * [1] = cantidadDePoblacionesEnGpu
 * [2] = cantidadDePoblacionesEnCpu
 * [3] = tamanioPoblacion
 * [4] = cantidadGenesPorIndividuo
 * [5] = metodoDeSeleccion
 * [6] = operadorCruzamiento
 * [7] = operadorMutacion
 * [8] = probabilidadCruzamiento
 * [9] = probabilidadMutacion
 * [10] = mecanismosDeReemplazo
 * [11] = numeroGeneraciones
 * [12] = cantidadDeHilosEnLasPoblacionesDeLaGpu
 * [13] = cantidadDeHilosEnLasPoblacionesDeLaCpu
 * [14] = memoriaCompartidaEnLaGpu
 * [15] = calcularFitnessEnGpu
 * [16] = criterioDeParada
 * [17] = funcionFitness
 * [18] = gradoNoUniformidad
 *
 */
void asignarParametros(int * parametros){
	tipoRepresentacion = parametros[0];
	cantidadPoblaciones = parametros[1];
	cantCromosomasPoblacion = parametros[3];
	cantGenesEnCromosoma = parametros[4];
	totalGenesEnPoblacion = cantCromosomasPoblacion * cantGenesEnCromosoma;
	tipoSeleccion = parametros[5];
	tipoCruzamiento = parametros[6];
	tipoMutacion = parametros[7];
	probabilidadCruzamiento = parametros[8];
	probabilidadMutacion = parametros[9];
	tipoReemplazo = parametros[10];
	numeroGeneraciones = parametros[11];
	gradoNoUniformidad = parametros[18];
}

int estaPresente(int valor, int* nuevaPoblacion, int desde, int hasta){
	for (int i = desde; i< hasta; i++) {
		if (nuevaPoblacion[i] == valor)
			return 1;
	}
	return 0;
}

int posicionPrimerLibre(int* poblacionActual, int posicionNuevoCromosoma){
	for(int i=0; i<cantGenesEnCromosoma; i++){
		if(poblacionActual[posicionNuevoCromosoma+i]==-1)
			return i;
	}
	return -1;
}

 int dondeEsta(int* poblacionActual, int valor, int posicionNuevoCromosoma){

	for(int i=0; i<cantGenesEnCromosoma; i++){
		if(poblacionActual[posicionNuevoCromosoma+i]==valor)
			return i;
	}
	return 0;
}
#endif
